package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 用户表 - 下面使用go struct表示表结构
type User struct {
	// 继承gorm的基础Model,里面默认定义了ID、CreatedAt、UpdatedAt、DeletedAt 4个字段
	gorm.Model
	Name string
}

// 个性化信息表
type Profile struct {
	gorm.Model
	UserID uint // 外键
	// 定义user属性关联users表，默认情况使用 类型名 + ID 组成外键名，在这里UserID属性就是外键
	User User
	Name string
}

func Mysqlinit() (db *gorm.DB) {
	fmt.Print("My init DB")
	dsn := "root:root@tcp(192.168.42.200:3306)/portscan?charset=utf8mb4"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("err")
	}
	return db
}

func My_first_table(db *gorm.DB) {
	fmt.Println("My_first_table   create table Product ")
	// Migrate the schema
	db.AutoMigrate(&User{})
	db.AutoMigrate(&Profile{})

}

func create_user(db *gorm.DB) {
	fmt.Println("My_first_table   create table Product ")
	//Migrate the schema
	c := User{
		Name: "3",
	}
	////插入一条用户数据
	////下面代码会自动生成SQL语句：INSERT INTO `users` (`username`,`password`,`createtime`) VALUES ('tizi365','123456','1540824823')
	if err := db.Create(&c).Error; err != nil {
		fmt.Println("插入失败", err)
		return
	}

	fmt.Println(c.ID)
	//u.ID           // 返回主键id，默认主键名为ID，也可以通过gorm标签定义，请参考前面的模型定义章节
	//u.Error        // 返回 error
	//u.RowsAffected // 返回插入记录的条数

	p := Profile{
		Model:  gorm.Model{},
		UserID: c.ID,
		User:   User{},
		Name:   "",
	}
	if err := db.Create(&p).Error; err != nil {
		fmt.Println("插入失败", err)
		return
	}

}

func main() {
	//dsn := "user:pass@tcp(192.168.42.200:3306)/portscan?charset=utf8mb4&parseTime=True&loc=Local"
	dsn := "root:root@tcp(192.168.42.200:3306)/portscan?charset=utf8mb4"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		fmt.Println("err")
	}
	if db != nil {
		fmt.Println("db")

	}
	Mydb := Mysqlinit()
	My_first_table(Mydb)

	create_user(Mydb)

	user := User{}
	// 查询用户数据
	//自动生成sql： SELECT * FROM `users`  WHERE (username = 'tizi365') LIMIT 1

	//db.Where("name = ?", "3").First(&user)
	//db.First(&user)

	fmt.Println(user)
	fmt.Println(user.Name)
	fmt.Println("user", user.Name)

}
